package com.cskaoyan.javase.oop2.encapsulate._1extends._6protected._3clone;

/**
 * 在Java中所有类的父类---Object类当中存在一个受保护的成员方法clone
 * 这个受保护的成员方法是java.lang.Object类中的一个成员方法
 * 它的访问权限是protected
 *
 * @since 10:16
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student s = new Student();
        // 问题: s引用能不能调用clone方法?
        /*
            这种场景,是创建"兄弟姐妹"对象,访问它们从父类中继承过来的受保护成员
            受保护成员的意义就是保护它们永远被子类自身所使用
            不能用别人的,别人也用不了你的.
         */
        // 'clone()' has protected access in 'java.lang.Object'
        // s.clone();
        Teacher t = new Teacher();
        t.clone();
    }
}

class Student {
    public void test() throws CloneNotSupportedException {
        // 问题: 这里能不能直接调用clone方法? 可以调用,因为有自身对象this
        // Unhandled exception: java.lang.CloneNotSupportedException
        // 这里的报错不是没有权限,而是和异常有关,大家碰到了直接alt+回车即可
        clone();
    }
}

class Teacher {
    // 为了让外部能够调用Teacher类的clone方法,需要重写方法的访问权限
    /*
        以下clone方法的访问权限仍然是protected,这里访问权限重写了吗?
        当然重写了
        因为protected权限,首先要考虑同包
        现在重写的clone方法的所处包已经改变了,那么访问权限必然也改变了
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}